#ifndef __PRIVATEBUS_H__
#define __PRIVATEBUS_H__

/*
 * 私有协议公共部分，主要定义协议数据类型
 *
 * */
//-----------------------------------------Configs
//0 不使用串口收发控制端口 1使用串口收发端口 用于配置硬件电路，485收发如果是经典485收发电路，需要控制串口收发状态
#define PB_USE_UART_RT 1

#ifdef __cplusplus
extern "C"{
#endif

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

typedef struct {//ModBus输入输出，以及错误
    uint8_t Slave_Address;//当前设备从机地址
    uint8_t Slave_Use_Address;//当前使用的地址
    uint8_t Slave_Use_F_code;//当前的功能码

    uint8_t *in_buffer;
    uint16_t in_len;
    uint8_t *out_buffer;
    uint16_t out_len;
}PB_STRUCT;

typedef enum {
    PB_ERR_NONE=0x00,
    PB_ERR_FUN=0x01,//非法功能
    PB_ERR_ADDR,//非法数据地址
    PB_ERR_DATA,//非法数据
    PB_ERR_STOP,//从站设备故障
    PB_ERR_TIMEOUT,//超时
    PB_ERR_SLAVE,//接收从机地址错误
    PB_ERR_SLAVE_IN_ADDR,//总线设备过多
    PB_ERR_UART_PTR,
    PB_ERR_ADDR_NONE,//空间不足
    PB_ERR_OOM,//内存不足
}PB_ERR;

typedef enum {
    PB_LED_STATE_OFF=0,
    PB_LED_STATE_ON,
}PB_LED_STATE;

typedef enum {
    PB_Level_State_Low=0,
    PB_Level_State_High,
}PB_Level_State;

//异步消息储存，

typedef struct PB_CallBack_Msg PB_CallBack_Msg;
struct PB_CallBack_Msg{
    uint8_t msg_num;//消息编号,返回消息自动填充到编号
    uint8_t *tx_data;//发送数据
    uint16_t tx_len;
    uint8_t *rx_data;//消息指针 Malloc申请的空间，需要手动释放，默认为空指针NULL
    uint16_t *rx_len;//数据的长度

    PB_CallBack_Msg* next;//下一个消息
};

typedef enum {
    PB_Reg_Coil_State_On,
    PB_Reg_Coil_State_Off
}PB_Reg_Coil_State;

#define PB_DEFAULT_UART_TX_LEN 128
#define __2U8TU16(Hbit,Lbit) (((uint16_t)Hbit<<8)|(uint16_t)Lbit)

//根据宏定义函数
#if (PB_USE_UART_RT == 0)
#define PB_Set_RT_State_Macro(_Level_) do{}while(0)
#elif (PB_USE_UART_RT == 1)
#define PB_Set_RT_State_Macro(_Level_) do{PB_Set_RT_State(_Level_);}while(0)
#endif

//#define Macro_PB_Set_RT_State PB_Set_RT_State

//
#ifdef __cplusplus
};
#endif
#endif

